module.exports = (option, app) => {
  // 全局抛出异常处理
  return async function errorHandler(ctx, next) {
    try {
      await next()
      // 404 处理
      if (ctx.status === 404 && !ctx.body) {
        ctx.body = { msg: 'fail', data: '404 错误' }
        ctx.status = 404
      }
    } catch (err) {
      // 记录一条错误日志
      // app.emit('error', err, ctx);
      const status = err.status || 500
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      let error =
        status === 500 && app.config.env === 'prod' ? 'Internal Server Error' : err.message
      // 参数验证异常
      if (status === 422 && err.message === 'Validation Failed') {
        if (err.errors && Array.isArray(err.errors)) {
          error = err.errors[0].err[0] ? err.errors[0].err[0] : '参数错误'
          error = error.replace(/[\t\r\f\n\s]*/g, '')
        }
      }
      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = { message: 'fail', data: error }
      ctx.status = status
    }
  }
}
